{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e750f85b-47f0-47e9-99e2-e66358c61fb7",
   "metadata": {},
   "source": [
    "# 数据清洗和数据集准备\n",
    "\n",
    "- 每天记账:事由 消费金额\n",
    "\n",
    "- 网购\n",
    "\n",
    "- 黄金价格\n",
    "\n",
    "- 天气预报:日期 天气状况 温度 湿度 紫外系数 "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "641fafee-ace2-40d8-8905-fb5d842544ac",
   "metadata": {},
   "source": [
    "# 1、数据清洗  怎么用pandas清洗\n",
    "\n",
    "人非圣贤孰能无过！现实中的数据总有各种各样的错误，称为脏（dirty）数据或坏数据。坏数据在数据分析中可能会引发千奇百怪的异常与错误，所以有人说，坏数据要比无数据还坏。\n",
    "\n",
    "故在数据分析之前，常常要花费大量时间来清洗数据，来处理这些脏数据或坏数据。\n",
    "\n",
    "对于杂乱无规则的脏数据，常常可以归类如下：\n",
    "- 无用数据\n",
    "- 重复数据\n",
    "- 缺失数据\n",
    "- 错误或异常数据\n",
    "\n",
    "### 处理方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "03aaa505-3abf-40f0-89ab-08dc9ef26704",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0667d526-a639-418e-a89a-47e8b3d61743",
   "metadata": {},
   "source": [
    "## 无用数据\n",
    "\n",
    "顾名思义，加载读取的数据集中有些字段与所需无关。对应的数据清洗方法有二：\n",
    "- 保留下来不理它，只是耗些内存而已。\n",
    "- 删除它，眼不见心不烦。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "7fe04af0-5e64-4142-9022-e0d3d78bf915",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 3 entries, 0 to 2\n",
      "Data columns (total 4 columns):\n",
      " #   Column  Non-Null Count  Dtype\n",
      "---  ------  --------------  -----\n",
      " 0   A       3 non-null      int32\n",
      " 1   B       3 non-null      int32\n",
      " 2   C       3 non-null      int32\n",
      " 3   D       3 non-null      int32\n",
      "dtypes: int32(4)\n",
      "memory usage: 180.0 bytes\n"
     ]
    }
   ],
   "source": [
    "df = pd.DataFrame(np.arange(12).reshape(3,4),             ##12个数 3行4列 值：0-11\n",
    "                  columns=['A', 'B', 'C', 'D'])\n",
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "2cd6ab77-97e3-4fda-afd5-dff29e5b8112",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>12</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>18</td>\n",
       "      <td>20</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>24</td>\n",
       "      <td>26</td>\n",
       "      <td>28</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>32</td>\n",
       "      <td>34</td>\n",
       "      <td>36</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>40</td>\n",
       "      <td>42</td>\n",
       "      <td>44</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>48</td>\n",
       "      <td>50</td>\n",
       "      <td>52</td>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>56</td>\n",
       "      <td>58</td>\n",
       "      <td>60</td>\n",
       "      <td>62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>64</td>\n",
       "      <td>66</td>\n",
       "      <td>68</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>72</td>\n",
       "      <td>74</td>\n",
       "      <td>76</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>80</td>\n",
       "      <td>82</td>\n",
       "      <td>84</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>88</td>\n",
       "      <td>90</td>\n",
       "      <td>92</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>96</td>\n",
       "      <td>98</td>\n",
       "      <td>100</td>\n",
       "      <td>102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>104</td>\n",
       "      <td>106</td>\n",
       "      <td>108</td>\n",
       "      <td>110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>112</td>\n",
       "      <td>114</td>\n",
       "      <td>116</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>120</td>\n",
       "      <td>122</td>\n",
       "      <td>124</td>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A    B    C    D\n",
       "0     0    2    4    6\n",
       "1     8   10   12   14\n",
       "2    16   18   20   22\n",
       "3    24   26   28   30\n",
       "4    32   34   36   38\n",
       "5    40   42   44   46\n",
       "6    48   50   52   54\n",
       "7    56   58   60   62\n",
       "8    64   66   68   70\n",
       "9    72   74   76   78\n",
       "10   80   82   84   86\n",
       "11   88   90   92   94\n",
       "12   96   98  100  102\n",
       "13  104  106  108  110\n",
       "14  112  114  116  118\n",
       "15  120  122  124  126"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(np.arange(0,128,2).reshape(16,4),             ##64个数 16行4列 值：从0开始到128 每隔两个取一个值\n",
    "                  columns=['A', 'B', 'C', 'D'])\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0e2178d0-701b-4292-8216-90fbaae9885a",
   "metadata": {},
   "source": [
    "### `drop()`\n",
    "\n",
    "```\n",
    "df.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')\n",
    "```\n",
    "主要参数说明：\n",
    "- labels： 指定标识 \n",
    "- axis：按列或按行\n",
    "- inplace：直接修改"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "3567d55c-14d4-4c5e-87d9-b454e60b412f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>18</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>24</td>\n",
       "      <td>26</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>32</td>\n",
       "      <td>34</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>40</td>\n",
       "      <td>42</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>48</td>\n",
       "      <td>50</td>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>56</td>\n",
       "      <td>58</td>\n",
       "      <td>62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>64</td>\n",
       "      <td>66</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>72</td>\n",
       "      <td>74</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>80</td>\n",
       "      <td>82</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>88</td>\n",
       "      <td>90</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>96</td>\n",
       "      <td>98</td>\n",
       "      <td>102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>104</td>\n",
       "      <td>106</td>\n",
       "      <td>110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>112</td>\n",
       "      <td>114</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>120</td>\n",
       "      <td>122</td>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A    B    D\n",
       "0     0    2    6\n",
       "1     8   10   14\n",
       "2    16   18   22\n",
       "3    24   26   30\n",
       "4    32   34   38\n",
       "5    40   42   46\n",
       "6    48   50   54\n",
       "7    56   58   62\n",
       "8    64   66   70\n",
       "9    72   74   78\n",
       "10   80   82   86\n",
       "11   88   90   94\n",
       "12   96   98  102\n",
       "13  104  106  110\n",
       "14  112  114  118\n",
       "15  120  122  126"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.drop(['C'], axis=1)    ## 删掉C那一列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "201facbb-784b-43aa-8e1b-6fb6f1d57055",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>12</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>18</td>\n",
       "      <td>20</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>24</td>\n",
       "      <td>26</td>\n",
       "      <td>28</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>32</td>\n",
       "      <td>34</td>\n",
       "      <td>36</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>40</td>\n",
       "      <td>42</td>\n",
       "      <td>44</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>48</td>\n",
       "      <td>50</td>\n",
       "      <td>52</td>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>56</td>\n",
       "      <td>58</td>\n",
       "      <td>60</td>\n",
       "      <td>62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>64</td>\n",
       "      <td>66</td>\n",
       "      <td>68</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>72</td>\n",
       "      <td>74</td>\n",
       "      <td>76</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>80</td>\n",
       "      <td>82</td>\n",
       "      <td>84</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>88</td>\n",
       "      <td>90</td>\n",
       "      <td>92</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>96</td>\n",
       "      <td>98</td>\n",
       "      <td>100</td>\n",
       "      <td>102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>104</td>\n",
       "      <td>106</td>\n",
       "      <td>108</td>\n",
       "      <td>110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>112</td>\n",
       "      <td>114</td>\n",
       "      <td>116</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>120</td>\n",
       "      <td>122</td>\n",
       "      <td>124</td>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A    B    C    D\n",
       "0     0    2    4    6\n",
       "1     8   10   12   14\n",
       "2    16   18   20   22\n",
       "3    24   26   28   30\n",
       "4    32   34   36   38\n",
       "5    40   42   44   46\n",
       "6    48   50   52   54\n",
       "7    56   58   60   62\n",
       "8    64   66   68   70\n",
       "9    72   74   76   78\n",
       "10   80   82   84   86\n",
       "11   88   90   92   94\n",
       "12   96   98  100  102\n",
       "13  104  106  108  110\n",
       "14  112  114  116  118\n",
       "15  120  122  124  126"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df  ## 没完全删 再打开C还在"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "4bbfd16f-9dc1-4df9-bc71-694248eb15c1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>8</td>\n",
       "      <td>10</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>16</td>\n",
       "      <td>18</td>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>24</td>\n",
       "      <td>26</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>32</td>\n",
       "      <td>34</td>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>40</td>\n",
       "      <td>42</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>48</td>\n",
       "      <td>50</td>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>56</td>\n",
       "      <td>58</td>\n",
       "      <td>62</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>64</td>\n",
       "      <td>66</td>\n",
       "      <td>70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>72</td>\n",
       "      <td>74</td>\n",
       "      <td>78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>80</td>\n",
       "      <td>82</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>88</td>\n",
       "      <td>90</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>96</td>\n",
       "      <td>98</td>\n",
       "      <td>102</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>104</td>\n",
       "      <td>106</td>\n",
       "      <td>110</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>112</td>\n",
       "      <td>114</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>120</td>\n",
       "      <td>122</td>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      A    B    D\n",
       "0     0    2    6\n",
       "1     8   10   14\n",
       "2    16   18   22\n",
       "3    24   26   30\n",
       "4    32   34   38\n",
       "5    40   42   46\n",
       "6    48   50   54\n",
       "7    56   58   62\n",
       "8    64   66   70\n",
       "9    72   74   78\n",
       "10   80   82   86\n",
       "11   88   90   94\n",
       "12   96   98  102\n",
       "13  104  106  110\n",
       "14  112  114  118\n",
       "15  120  122  126"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.drop(['C'], axis=1,inplace=True)    ##inplace=True   C彻底被删掉了\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c17d5ed6-8847-4e55-995c-2ba297819e48",
   "metadata": {},
   "source": [
    "## 重复数据\n",
    "\n",
    "Pandas数据帧中的数据行是可以重复的，判断数据是否重复取决于数据的实际意义。在数据收集过程中，特别是人工收集的过程中，常会出现数据重复的现象。\n",
    "Pandas中提供了`df.duplicated()`、`df.drop_duplicates()`等方法来查看及删除重复数据。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2aa9dfd2-5ee4-43d8-93f2-f6885e01cf06",
   "metadata": {},
   "source": [
    "### `df.duplicated()`\n",
    "\n",
    "```python\n",
    "df.duplicated(subset=None, keep='first')\n",
    "```\n",
    "主要参数说明：\n",
    "- `subset=None`，识别重复标签（标量或序列），默认是所有列标签；\n",
    "- `keep='first'`：`'first'`标记第一个之外数据；`'last'`标记最后一个之外数据；`False`标记全部重复数据；"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "d6a92c14-6596-4e54-87ab-1f6ecc77461c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id1</th>\n",
       "      <th>id2</th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>a</td>\n",
       "      <td>a1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>a</td>\n",
       "      <td>a2</td>\n",
       "      <td>2</td>\n",
       "      <td>0.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>a</td>\n",
       "      <td>a2</td>\n",
       "      <td>3</td>\n",
       "      <td>0.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>b</td>\n",
       "      <td>b1</td>\n",
       "      <td>4</td>\n",
       "      <td>0.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>b</td>\n",
       "      <td>b2</td>\n",
       "      <td>5</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>b</td>\n",
       "      <td>b2</td>\n",
       "      <td>5</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  id1 id2  x    y\n",
       "0   a  a1  1  0.1\n",
       "1   a  a2  2  0.3\n",
       "2   a  a2  3  0.3\n",
       "3   b  b1  4  0.4\n",
       "4   b  b2  5  0.5\n",
       "5   b  b2  5  0.5"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame({\n",
    "    'id1': ['a', 'a', 'a', 'b', 'b', 'b'],\n",
    "    'id2': ['a1', 'a2', 'a2', 'b1', 'b2', 'b2'],\n",
    "    'x': [1, 2, 3, 4, 5, 5] ,\n",
    "    'y': [0.1, 0.3, 0.3, 0.4, 0.5, 0.5] ,\n",
    "})\n",
    "\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "7e50c2cf-c77c-4f1a-a995-a754b82e219d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    False\n",
       "1    False\n",
       "2    False\n",
       "3    False\n",
       "4    False\n",
       "5     True\n",
       "dtype: bool"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.duplicated()    # True表示发现某组数据是重复的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "d447c2e3-e19d-4653-bd26-784e788d1b62",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id1</th>\n",
       "      <th>id2</th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>b</td>\n",
       "      <td>b2</td>\n",
       "      <td>5</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  id1 id2  x    y\n",
       "5   b  b2  5  0.5"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df.duplicated()]   # 直接显示重复的一组数据"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d8d4486-c5aa-4b1a-ab4b-d746e22e365d",
   "metadata": {},
   "source": [
    "### `df.drop_duplicates`\n",
    "\n",
    "```python\n",
    "df.drop_duplicates(subset=None, keep='first', inplace=False)\n",
    "```\n",
    "主要参数说明：\n",
    "- `subset=None`，识别重复标签（标量或序列），默认是所有列标签；\n",
    "- `keep='first'`：`'first'`标记第一个之外数据；`'last'`标记最后一个之外数据；`False`标记全部重复数据；\n",
    "- `inplace=False`，是否在对象中直接修改；"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "1effcf37-df1f-424a-aaa7-dbf213a66718",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id1</th>\n",
       "      <th>id2</th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>b</td>\n",
       "      <td>b2</td>\n",
       "      <td>5</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>b</td>\n",
       "      <td>b2</td>\n",
       "      <td>5</td>\n",
       "      <td>0.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  id1 id2  x    y\n",
       "4   b  b2  5  0.5\n",
       "5   b  b2  5  0.5"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.tail(2)   #看后两组数组 头两组（head）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "20b039b1-40e1-439d-a541-2fd9f2531a26",
   "metadata": {},
   "source": [
    "## 缺失数据\n",
    "\n",
    "在实际工作中，由于种种原因，采集到的数据中会存在缺失。Pandas设计目标之一就是便利地处理缺失值。然而，了解数据的缺失以及对缺失数据进行处理，仍然是一件重要的事。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fbc208bd-a1fa-4970-8633-2dda81a82fba",
   "metadata": {},
   "source": [
    "在Pandas中，对于数值型数据，使用`NaN (Not a Number)`来表示缺失值；对于日期型`datetime64`则使用`NaT (Not a Time)`来表示。\n",
    "pandas中对缺失数据的常用处理方法有：\n",
    "- `isnull()`: 返回缺失数据的布尔结果\n",
    "- `notnull()`：`isnull()`的否定式\n",
    "- `dropna()`：去除缺失数据\n",
    "- `fillna()`：填充缺失数据"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d570bf5-19c0-4c89-a589-00296db51a7f",
   "metadata": {},
   "source": [
    "### `isnull()`与`notnull()`\n",
    "\n",
    "使用这两个方法判断数据中是否存在缺失值\n",
    "\n",
    "### `dropna()`\n",
    "\n",
    "```python\n",
    "df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)\n",
    "```\n",
    "主要参数说明：\n",
    "- `axis=0`：默认是丢弃行;\n",
    "- `how='any`: 默认是丢弃任何含有缺失值的行，`all`表示全部是缺失值才丢弃;\n",
    "\n",
    "### `fillna()`\n",
    "\n",
    "pandas提供了`fillna()`方法，用来补全缺失值，而非简单过滤。其调用语法为：\n",
    "\n",
    "```python\n",
    "df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)\n",
    "```\n",
    "主要参数：\n",
    "- `value`： 指定标量或字典对象用于填充缺失值。\n",
    "- `method`： 指定插值方法，默认是`ffill`前填充。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "38c57c65-c5dd-4ee9-91e1-50f81a3af489",
   "metadata": {},
   "source": [
    "## 错误和异常数据\n",
    "\n",
    "在数据集中，还有一些数据的格式正常，但其值超乎常规或者不符合业务逻辑。对于这些“异常”数据，要特别小心。它们或许是错误的，但也可能是真实的。\n",
    "\n",
    "这些异常数据，通常要结合业务逻辑来判断。不同数据集其方法也不同。常用方法是先使用统计得到标准房差，然后设定阈值，超过多少倍标准方差的即为异常数据。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "19662fd0-13cf-4967-96b4-ffd876bc66d8",
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'incomes' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[23], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m incomes\u001b[38;5;241m.\u001b[39mdescribe()\n",
      "\u001b[1;31mNameError\u001b[0m: name 'incomes' is not defined"
     ]
    }
   ],
   "source": [
    "incomes.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cffb7779-efca-4ecf-90af-b0263cba8e2d",
   "metadata": {},
   "source": [
    "### 课堂练习（科学数据）\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "17a58023-1eaf-473c-b559-37988428a518",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<>:1: SyntaxWarning: invalid escape sequence '\\w'\n",
      "<>:1: SyntaxWarning: invalid escape sequence '\\w'\n",
      "C:\\Users\\CC\\AppData\\Local\\Temp\\ipykernel_16856\\711605654.py:1: SyntaxWarning: invalid escape sequence '\\w'\n",
      "  df1 = pd.read_table(\"D:\\work\\\\astro-pandas-tutorials\\Sample_data\\\\rcs.txt\", delim_whitespace=True, comment=\"#\")\n",
      "C:\\Users\\CC\\AppData\\Local\\Temp\\ipykernel_16856\\711605654.py:1: FutureWarning: The 'delim_whitespace' keyword in pd.read_table is deprecated and will be removed in a future version. Use ``sep='\\s+'`` instead\n",
      "  df1 = pd.read_table(\"D:\\work\\\\astro-pandas-tutorials\\Sample_data\\\\rcs.txt\", delim_whitespace=True, comment=\"#\")\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>wave</th>\n",
       "      <th>flam</th>\n",
       "      <th>noise</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>11436.9</td>\n",
       "      <td>-1.795000e-17</td>\n",
       "      <td>5.534000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>11439.2</td>\n",
       "      <td>1.203000e-16</td>\n",
       "      <td>4.374000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>11441.4</td>\n",
       "      <td>1.857000e-17</td>\n",
       "      <td>4.261000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>11443.7</td>\n",
       "      <td>-1.751000e-16</td>\n",
       "      <td>3.584000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>11446.0</td>\n",
       "      <td>-8.348000e-17</td>\n",
       "      <td>3.160000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>11448.3</td>\n",
       "      <td>-3.572000e-17</td>\n",
       "      <td>2.931000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>11450.6</td>\n",
       "      <td>-1.124000e-16</td>\n",
       "      <td>2.687000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>11452.9</td>\n",
       "      <td>-1.364000e-18</td>\n",
       "      <td>2.325000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>11455.2</td>\n",
       "      <td>-3.597000e-17</td>\n",
       "      <td>1.885000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>11457.5</td>\n",
       "      <td>-7.648000e-17</td>\n",
       "      <td>1.380000e-17</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      wave          flam         noise\n",
       "0  11436.9 -1.795000e-17  5.534000e-17\n",
       "1  11439.2  1.203000e-16  4.374000e-17\n",
       "2  11441.4  1.857000e-17  4.261000e-17\n",
       "3  11443.7 -1.751000e-16  3.584000e-17\n",
       "4  11446.0 -8.348000e-17  3.160000e-17\n",
       "5  11448.3 -3.572000e-17  2.931000e-17\n",
       "6  11450.6 -1.124000e-16  2.687000e-17\n",
       "7  11452.9 -1.364000e-18  2.325000e-17\n",
       "8  11455.2 -3.597000e-17  1.885000e-17\n",
       "9  11457.5 -7.648000e-17  1.380000e-17"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1 = pd.read_table(\"D:\\work\\\\astro-pandas-tutorials\\Sample_data\\\\rcs.txt\", delim_whitespace=True, comment=\"#\")\n",
    "df1.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "af869332-09e7-4437-903e-9046dead52ee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1121 entries, 0 to 1120\n",
      "Data columns (total 3 columns):\n",
      " #   Column  Non-Null Count  Dtype  \n",
      "---  ------  --------------  -----  \n",
      " 0   wave    1121 non-null   float64\n",
      " 1   flam    1107 non-null   float64\n",
      " 2   noise   1121 non-null   float64\n",
      "dtypes: float64(3)\n",
      "memory usage: 26.4 KB\n"
     ]
    }
   ],
   "source": [
    "df1.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "d04ca95c-fdbb-4142-8dd8-cc1e10f44ff3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>wave</th>\n",
       "      <th>flam</th>\n",
       "      <th>noise</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [wave, flam, noise]\n",
       "Index: []"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1[df1.duplicated()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "95904588-607c-4e92-80bc-cbd6b39d5012",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>wave</th>\n",
       "      <th>flam</th>\n",
       "      <th>noise</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>1121.000000</td>\n",
       "      <td>1.107000e+03</td>\n",
       "      <td>1.121000e+03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>12819.974844</td>\n",
       "      <td>1.633409e-17</td>\n",
       "      <td>2.663281e-16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>830.235363</td>\n",
       "      <td>4.336269e-16</td>\n",
       "      <td>2.096674e-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>11436.900000</td>\n",
       "      <td>-1.031000e-14</td>\n",
       "      <td>0.000000e+00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>12096.000000</td>\n",
       "      <td>-5.886500e-19</td>\n",
       "      <td>3.083000e-18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>12793.100000</td>\n",
       "      <td>3.920000e-18</td>\n",
       "      <td>5.154000e-18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>13530.400000</td>\n",
       "      <td>1.009500e-17</td>\n",
       "      <td>1.115000e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>14310.200000</td>\n",
       "      <td>4.415000e-15</td>\n",
       "      <td>5.516000e-14</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               wave          flam         noise\n",
       "count   1121.000000  1.107000e+03  1.121000e+03\n",
       "mean   12819.974844  1.633409e-17  2.663281e-16\n",
       "std      830.235363  4.336269e-16  2.096674e-15\n",
       "min    11436.900000 -1.031000e-14  0.000000e+00\n",
       "25%    12096.000000 -5.886500e-19  3.083000e-18\n",
       "50%    12793.100000  3.920000e-18  5.154000e-18\n",
       "75%    13530.400000  1.009500e-17  1.115000e-17\n",
       "max    14310.200000  4.415000e-15  5.516000e-14"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "1b8ecfcf-5429-4dfc-91bc-2ab2442612ef",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "wave      0\n",
       "flam     14\n",
       "noise     0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "40ed5b6f-62f3-4d1e-853b-89d57521c0f7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>wave</th>\n",
       "      <th>flam</th>\n",
       "      <th>noise</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1107</th>\n",
       "      <td>14273.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1108</th>\n",
       "      <td>14275.9</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1109</th>\n",
       "      <td>14278.8</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1110</th>\n",
       "      <td>14281.6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1111</th>\n",
       "      <td>14284.5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1112</th>\n",
       "      <td>14287.3</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1113</th>\n",
       "      <td>14290.2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1114</th>\n",
       "      <td>14293.1</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1115</th>\n",
       "      <td>14295.9</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1116</th>\n",
       "      <td>14298.8</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1117</th>\n",
       "      <td>14301.6</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1118</th>\n",
       "      <td>14304.5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1119</th>\n",
       "      <td>14307.4</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1120</th>\n",
       "      <td>14310.2</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         wave  flam  noise\n",
       "1107  14273.1   NaN    0.0\n",
       "1108  14275.9   NaN    0.0\n",
       "1109  14278.8   NaN    0.0\n",
       "1110  14281.6   NaN    0.0\n",
       "1111  14284.5   NaN    0.0\n",
       "1112  14287.3   NaN    0.0\n",
       "1113  14290.2   NaN    0.0\n",
       "1114  14293.1   NaN    0.0\n",
       "1115  14295.9   NaN    0.0\n",
       "1116  14298.8   NaN    0.0\n",
       "1117  14301.6   NaN    0.0\n",
       "1118  14304.5   NaN    0.0\n",
       "1119  14307.4   NaN    0.0\n",
       "1120  14310.2   NaN    0.0"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.loc[df1['flam'].isnull()]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "75e787b8-4b2f-43e4-b309-ed4ef245da63",
   "metadata": {},
   "source": [
    "# 机器学习"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7e7d8ca4-31cf-4b93-ad47-5efc5d27091e",
   "metadata": {},
   "source": [
    "### 常见的六大任务和问题\n",
    "\n",
    "- 分类问题（Classification）\n",
    "- 聚类问题（Clustering）\n",
    "- 回归问题（Regression）\n",
    "- 关联问题（Association）\n",
    "- 序列问题（Sequence）\n",
    "- 异常检测问题（Outlier Detection）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2db68f72-2fd0-443d-92fb-5f79618e6581",
   "metadata": {},
   "source": [
    "# 线性回归中最小二乘与机器学习算法的区别"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "d72e00db-e590-4f70-a07c-03d8a3de2932",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import scipy as sp\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import sklearn\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "d6939ea4-377c-4a8b-af0b-4157705f7d1f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib\n",
    "# 指定默认字体  \n",
    "matplotlib.rcParams['font.family']='sans-serif'  \n",
    "matplotlib.rcParams['font.sans-serif'] = ['SimHei']   \n",
    "#解决负号'-'显示为方块的问题  \n",
    "matplotlib.rcParams['axes.unicode_minus'] = False "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3049820-47c3-4669-9961-a2d0021b99ce",
   "metadata": {},
   "source": [
    "## 数据示例\n",
    "\n",
    "哈勃定律原始数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "452177fc-95a9-47eb-8a1b-cdbbffb212bd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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369169bFbff5fAoEAnHbIpGI8vPzk9YSKSgomBReAADAwpRyEHnuued05swZLV26VJI0MjKiF154Qddee60uXrwY229gYEDRaFQ+n09+v1/PPPPMlDUAAICUb828/vrrCgQCOnr0qI4ePao/+7M/0+OPP67XXntNjuNo3759kqRt27apsbFRbrdba9asSVgDAABI+YrIVVddFbe+ZMkSLVu2TMuWLdOuXbvU3NyslpYWjY2N6eDBg5f+eF5ewhoAAIDLzNBUp0NDQ+rt7VVDQ4NKS0tTrk0nHA7L6/XKcZy4H8kCAID5K9Xzd9rziCRSUVGhioqKtGsAACB38dI7AABgDUEEAABYQxABAADWEEQAAIA1BBEAAGANQQQAAFhDEAEAANYQRAAAgDUEEQAAYA1BBAAAWEMQAQAA1hBEAACANQQRAABgDUEEAABYQxABAADWEEQAAIA1BBEAAGANQQQAAFhDEAEAANYQRAAAgDUEEQAAYA1BBAAAWEMQAQAA1hBEAACANQQRAABgDUEEAABYQxABAADWEEQAAIA1BBEAAGANQQQAAFhDEAEAANYQRAAAgDUEEQAAYE1eJh86e/as3nrrLX3605/WsmXLZrpNQNYZGzc61H9OpyOjWl7k0eoqn9yLXLabBQDzXtpXRJ5//nldf/31+ta3vqWrr75azz//vCQpEAjI7/erpKRELS0tMsbEPpOsBmS7rsCwbtnerXt29+jB54/qnt09umV7t7oCw7abBgDzXlpB5P3339cDDzyg119/XUeOHNHTTz+thx9+WNFoVE1NTaqrq1Nvb6+CwaA6OjokKWkNyHZdgWFtevawhp3RuO2nnFFtevYwYQQAppFWEIlEInrqqae0cuVKSdIf/dEfKRQK6cCBA3IcR+3t7aqurlZbW5v27NkjSUlrQDYbGzdq7Qxqqut7E9taO4MaG+cKIAAkklYQqays1IYNGyRJFy9e1BNPPKG77rpLfX19qq+vV2FhoSSptrZWwWBQkpLWphKNRhUOh+MWYD461H9u0pWQjzKShp1RHeo/N3eNAoAsk9FTM319fbryyiv1yiuv6KmnnlI4HFZVVVWs7nK55Ha7FQqFktamsnXrVnm93thSWVmZSROBWXc6kjiEZLIfAOSijIJIbW2tfvnLX2rFihW67777lJeXp4KCgrh9PB6PRkZGktamsnnz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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 数据可视化\n",
    "X_data = np.array([0.21, 0.26, 0.27, 0.27, 0.45, 0.5, 0.8, 1.1, 1.4, 2.0])\n",
    "y_data = np.array([130, 70, 185, 220, 200, 270, 300, 450, 500, 800])\n",
    "plt.scatter(X_data, y_data)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7faa1e4a-b211-4ddc-9b4c-505a8783673e",
   "metadata": {},
   "source": [
    "### 使用机器学习进行线性回归\n",
    "\n",
    "```\n",
    "sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)\n",
    "```\n",
    "\n",
    "- 参数：\n",
    "    - `fit_intercept`：是否需要计算$b$\n",
    "    - `normalize`： 是否需要归一化\n",
    "- 属性：\n",
    "    - `coef_`：权重向量\n",
    "    - `intercept_`： $b$值\n",
    "- 方法\n",
    "    - `fit`\n",
    "    - `predict`\n",
    "    - `score`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "91e84be7-4b87-4f0c-8a23-ad1a79159f36",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "X_train = np.array(X_data).reshape(-1, 1)\n",
    "y_train = np.array(y_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "4e8836f7-3826-4a61-b0a0-50c243b5b9d5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-2 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-2 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-2 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-2 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-2 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LinearRegression()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;LinearRegression<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.linear_model.LinearRegression.html\">?<span>Documentation for LinearRegression</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>LinearRegression()</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "LinearRegression()"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 构建模型\n",
    "regr = LinearRegression()\n",
    "regr.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "fc120ea2-1afe-4efc-a508-8234d263bda1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([352.72863808]), 56.41900875281618)"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "regr.coef_, regr.intercept_   ##coef 斜率 intercept 截距"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "09332ea3-e16a-48cf-9055-a46ab41967c4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, '线性模型拟合结果[352.72863808]')"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiIAAAGxCAYAAABfrt1aAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABavklEQVR4nO3dd3gU1f7H8fdm00knSAlBAohKF4wiIDbkWkCK2MACiIrYCyo2xAJBEVEsCKiI93ovghRRQVAUQS9IFCIYBCmRFjCBsAkkLCnn98dc9scKCUkImU3yeT3PPD5nzs7MN9ks+3HOmRmHMcYgIiIiYgM/uwsQERGRmktBRERERGyjICIiIiK2URARERER2yiIiIiIiG0URERERMQ2CiIiIiJiGwURERERsY2CiIiIiNhGQUSqpcLCQg4cOHBS+5g5cyaffPKJ1zpjDKNGjSI9PR2At956i82bN5/UcQB++eUXXnzxxWPW//7777z99tvH3aaoqKhcx9q/fz9//fVXmbZZuHBhscd79913eeedd8pVS1lcfPHFOBwOzzJt2rRTfkwpu+eee87rfRo4cKDdJYmPUxARn3XPPffw4IMPcvRTCLZs2UKzZs34+OOPMcawbdu24267aNEiwsPDiw0jF1xwAW+++WaJx587dy5z5swBwO12k5+fj8PhICkpiezsbACeeeYZNm7cSGFhIbm5uZ5t165dy3PPPceYMWNISkryWkaNGsUvv/yC2+321LdhwwYmTZp0TA3JyckMHz78mPUTJkygZ8+envaTTz7JP/7xjxJ/niOeffZZzjzzzFIHtZSUFK688kpef/314/b/8MMPLF++vMR93H777TgcDvz9/T2Lw+HA6XQes+6rr74qdj+jRo1i9erVrF69mmuuuaZU9UvlGjp0qOc9uuuuu+wuR6oABRHxSVlZWUybNo0zzzwTh8PhWR8TE8PmzZupVasW8+bNo3Xr1qSmph6zfWBgoNd/Aa699lrP/0UfOHCAwsLCEmsIDg4mKCgIgKlTp1K/fn3q1auH2+2mS5cu1KtXD5fLxYABA6hXrx7XXnutZ1uXy8Xq1auZMWMGEyZMYM2aNXz99deMGDGCtWvXsm/fPiZOnEi3bt0ACAoK8hzraAEBAdSqVcvT/u2331i1ahUdOnTgyy+/5LvvvgMgPz+fw4cPl/jzAKxcuZJJkyYRHR193DMwxzNp0iRatmzJvffeC1hnm44+1pEQccThw4fJy8vz2kdwcDAXXXQRBQUFnqVt27a8/vrrXuuO/C6K06hRI9q1a0e7du2IiYnxrM/JyeGll17i+uuv59577+XXX3/12u7JJ5/0+r90h8NBx44dPf15eXkMGzaM2rVrExAQQPv27Vm9enWpfj9w7FmAo5fnnnuu1MeYMWMGLVq0IDQ0lDPPPJOpU6ce93h5eXk0adLE854cbffu3Tz11FNcd911PProo6SlpXn1L1myhA4dOhAaGkrjxo156aWX+Psjx8aNG0d8fDynnXYazzzzzDFnwyZOnEjTpk0JDQ2lTZs2zJs3z9NXr149z3tUr1690v4KpSYzIj5oxIgR5rLLLjPGGJOdne3VB5hFixYZY4wZNmyYmTFjhlf/wYMHzffff28A88UXX5i1a9eaoqIiExYWZr766itjjDFt27Y1EydONMYYU1BQYPLy8jzbFxQUGGOMuf32281tt93mtc4YY9q3b2/+/PNPY4wxrVu3Nt9//32xP8fLL79srrrqKmOMMcuWLTNHf+TeeOMN07VrV2OMMXPmzDFNmzb19KWlpZmNGzead99918TFxZktW7aY3bt3m6FDh3r217lzZ9O5c2fP76t79+7F1mGMMXv27DHx8fHmiSeeMDt37jRxcXHm1VdfLXGbLVu2mMDAQPP1118bY4yZNWuW+eabbwxQ4nKkriPuu+8+c9FFF3mtO/o9OAIo9vd50UUXmQ8++OCY9YcOHTLt2rUz5557rhk5cqS5+OKLTVBQkElJSfG85oorrjBDhw41q1at8izr16/39A8aNMhERUWZUaNGmUmTJpnTTz/dxMXFef1dlGTnzp1e+161apVZuHChcTqdZt68eaU6xq+//mpCQkLMm2++aZYuXWqeeuopA5j58+cfc7wnnnjCxMbGmn379nmtz8jIMA0bNjSXXXaZGTlypDnnnHNMTEyMSU9PN8YYk56e7qnh+++/N6+++qoJCAjweh9ee+0143A4zHPPPWc+//xz07RpU5OUlOTpX7BggYmIiDAffvih+e6778wdd9xhnE6nWbNmzTF1jhw50vMZEimOgoj4nN9//91ERUWZ9evXm+zsbFOnTh0zYcIETz9g5s2bZ3799Vczffp0M3DgQHPFFVcYY4z566+/jMPhMJ988okBzKOPPmpuuukms2HDhhK/OI/+kuzdu7dxOp3G4XAYh8NhAPPKK6+Y999/39xwww3FLjk5Ocf8LC+++KLp06ePMebYIDJx4kTPcf8eRO6++24TGhpqQkJCjJ+fnwkJCTEPPfSQeeCBB8yNN95ojDFm3rx5BjBLly49YRDJzMw0rVu3Ntdff70pLCw0xhiTkpJiYmJizHPPPWeKioqO2aagoMBceuml5pprrjHGGDN//nwDmLfeesvs3r3b7N+/3+Tk5JjbbrvNDBgwwOTk5JicnByTmZlpMjMzvfb1wAMPGIfDYYKCgjyLw+Ew/v7+XusAs2zZsuP+DMUFkVdeecWcddZZ5tChQ566zzzzTPPAAw94XlO3bl0za9as4+5348aNxul0mpUrV3rWff311wYwS5YsKfZ3eiKPP/64SUxMLPUxnn76aU/IPKJz587m9ttv91q3bt06ExAQYN59991jjnnPPfeYSy+91PN+Hjx40ERERJjXXnvNGGPM1KlTTYsWLby2GTBggCf0u91uExUVZe6++25P/5IlS0xkZKTJz883xhhz8803m2HDhnntIy4uzrzwwgvH1KMgIqXx/+dTRXxAeno61157LQ888ADx8fGMHz8ef39/2rZty2uvvcbatWsB6NOnD82aNaN9+/acddZZXHnllQBs3bqV4OBgzynhm2++mY4dO9KyZUvat2/PF198AUC3bt0YMGAAgwYNoqCgwGv4Z8aMGfj7+5OYmEjr1q2ZPHkyfn5+PPnkkxhjjpmzUVhYSMeOHXnvvfcA2L59O4899hiBgYGsXbuWrKwshgwZwp49ewAYOHAgderU4fTTTy/29/D222/z9ttvM3fuXB599FE2bdoEwKOPPuoZuujZsycffvghHTt25Kuvvip2MummTZvo0aMH55xzDh999BF+ftaIbJs2bVi8eDFXX3013377Le+88w5nn322Z7uxY8eyZMkSLr/8cm655RaWLVvGVVddxd13343b7cbpdBIQEOAZlgkLC6OwsBA/Pz9CQ0OP+R117drVM5QE0K5dO4YMGeI1vOBwOMo8CTcxMZEuXbp4fi9Op5O6devidrsB2LVrF3v27CExMfG42zdo0ICff/6Ztm3betbVrl0boFTDXceTkZHBm2++yezZs0t9jMzMzGN+9sOHDxMcHOxpG2MYOnQorVu3ZsiQIccc94orruDu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Meecc44ZOXLkcX+fQ4YMOeFVLoBZsWKF13ZZWVnmlltuMYB5+umnzRNPPGH69OljfvjhB/PPf/6z2P0cmUxrjDnhmZjilqN/5iNOFESOyMnJMY0bNzZDhgwp9jULFiwwgNm2bZvX+o8//tgA5j//+c8Jj1OcXr16mZtvvrnY/uKO0bp1azN+/HivdQMHDjT169c3xhgzevRoA5idO3d6vaZjx46eydp/t3PnThMREWFefPFFY4wxPXv2NPfff7/Xa5577jkTFBRksrOzzbfffmuAYyYbn3322Wb8+PEmPz/fREdHm9mzZ3v6ioqKzCWXXGIuuOCCY46vICKloTki4nMGDBjAxo0beeihh4iNjaVLly6cddZZjB49mj59+tCrVy9SUlJIT0/nxhtv5NdffyUnJ+eE+926dSvZ2dlkZmbSqlUrkpKS2Lt3L7m5uYwePRqw7i8ybtw4XnrpJc+ci549e/Laa68xcuRIdu/eze7duxkwYAB33HGHp52enu6530dAQAAzZ85k6dKlBAQE4HK5OHDgAJGRkbRt25ZXX32VAwcOeJbRo0fz/fff06NHD0+to0ePZsOGDfTt2/eYn+PQoUOem3k98cQTZGZm8ttvv3HOOecc9+cOCgqid+/e5OTkHHf57bffAAgJCfHaLicnh3/+858EBgby5ZdfsmvXLtq0aUPz5s0JCQmhdu3a5OXleS0333yz136GDh2Ky+WioKAAYwz79u2jVatWPPjgg7Rt25aJEydy0UUXce+992Ks/zEiJyeHH3/88YTv5xF//fUXLpfL0w4LC+OSSy5h/fr1APz000+eicJH7Nu3z/O7PCI1NZU77riDoUOHcsMNN5T6+EfLzs5m4cKFXveUOVpJx9i4cSNNmzb1WtemTRvS09PJy8ujVq1aBAUF0aBBA6/XHH2/mx07dnjdw6VBgwZ06NDB87so7hhut5sdO3ZwzjnnEBgYyA8//ODpz8nJYePGjTRo0IDMzEyysrK89uFwOGjdunWF3GFYaiYFEfE5SUlJfP3112zatAm3201GRobXzavatWtHgwYNaNeuHatXr2bZsmX06dOnQo4dFhbGihUrPJP7jhg3bhx169albt261KtXjylTpjBx4kTCwsKoV68etWvX9vqCiIqK4vXXX6du3bpERUURHh5OeHg4AwcOxOVyedrh4eHExMRQr149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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.arange(0, 2.2, 0.02).reshape(-1, 1)\n",
    "y = regr.predict(x)\n",
    "\n",
    "plt.plot(X_train, y_train, '.')\n",
    "plt.plot(x[:, 0], y)\n",
    "plt.title('线性模型拟合结果{}'.format(regr.coef_))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "45a94458-cf7b-40d8-8788-3088c5189bbf",
   "metadata": {},
   "source": [
    "### 作业\n",
    "\n",
    "1.Y=AX+B\n",
    " A,B 值 ? A=2,B=10\n",
    "2.X=0,19\n",
    "计算出Y的值\n",
    "3 . X (numpy.array([0,1,..., 19])\n",
    "1.\tY(numpy.array( AX+ B\t\n",
    "\n",
    "Numpy.random.normal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4360dcba-f739-4e29-9689-5ec72021ea1c",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "X_train = np.array(X_data).reshape(-1, 1)\n",
    "y_train = np.array(y_data)\n",
    "\n",
    "# 构建模型\n",
    "regr = LinearRegression()\n",
    "regr.fit(X_train, y_train)\n",
    "\n",
    "regr.coef_, regr.intercept_   ##coef 斜率 intercept 截距\n",
    "\n",
    "x = np.arange(0, 2.2, 0.02).reshape(-1, 1)\n",
    "y = regr.predict(x)\n",
    "\n",
    "plt.plot(X_train, y_train, '.')\n",
    "plt.plot(x[:, 0], y)\n",
    "plt.title('线性模型拟合结果{}'.format(regr.coef_))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b41439b2-f715-413d-a95e-46592f83ea2a",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\CC\\AppData\\Local\\Temp\\ipykernel_10072\\1905118005.py:28: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n",
      "  plt.plot(x, y, color='red', linewidth=2, label='Fitted line: Y=%.2fX+%.2f' % (coef, intercept))\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 32447 (\\N{CJK UNIFIED IDEOGRAPH-7EBF}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 24615 (\\N{CJK UNIFIED IDEOGRAPH-6027}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 27169 (\\N{CJK UNIFIED IDEOGRAPH-6A21}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 22411 (\\N{CJK UNIFIED IDEOGRAPH-578B}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 25311 (\\N{CJK UNIFIED IDEOGRAPH-62DF}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 21512 (\\N{CJK UNIFIED IDEOGRAPH-5408}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 32467 (\\N{CJK UNIFIED IDEOGRAPH-7ED3}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "D:\\python\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 26524 (\\N{CJK UNIFIED IDEOGRAPH-679C}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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A3Ollus9V3x8vAHM7t27c+X1smvatGmmbNmy5vfff3e0TZo0yZQvX9788ccfWX6+PXv2mMjISLNy5Urzyy+/mK+//trUqFHDPPTQQ5k+Lioqynh7e5v333/f/PDDD2bo0KGmVKlS5rfffnP0mThxovH39zfLli0ze/bsMd27dzchISEmOTnZ0eeTTz4xfn5+5ueffzbGGHP27FlTs2ZN8/jjj1/ztceMGWP69u173fe2fft2U6VKFVO3bl0zdOjQTPvOmDHD+Pv7m6ioKHPgwAGzaNEiU7p0abNy5UpHn5EjR5rQ0FDz+eefmwMHDpgZM2aYkiVLmm+//TbD5yzIP5siHrVkiTEBAY4Lwp3DxzzODANpbrnoaW7KyoXlFD7cJKOr2qZr3bq14wujdevWBnC5rV+//qq2MWPGGGOMSUlJMf/+979NaGio8fPzM7fffrtZv369y/PPmTPHhIeHG19fX9O5c2fz5ptvZil8pL9++lVt08PL6tWrTa1atUypUqXMfffd5xISjDHmo48+MrVq1TI+Pj6mZs2a5t13383S31laWpq56667zAMPPGCMMebHH380JUuWNMuXL8/S82RmyZIlpkSJEubChQvX7HP77bdfFRBq1aplnn32WUedwcHBZuLEiY7j58+fN4GBgWbWrFkuj+vSpYtp0aKFsdvtZujQoaZq1arm1KlT13ztGwkfp06dMjVq1DBr1651+bd0Lc2bNzcjRoxwaRs6dKhp2bKl435ISIiZPn26S59OnTqZ3r17Z/icBflnU8Qjzp0z5oknXK5EmxxSw7SrsNvl4rTh4QUjeBiTtfBROM52adwYjh51/+sGB8POnbn6lNHR0dSrV49//vOfDBw4EICyZcsydepUXnrpJfbt2wdA6dKlAejfvz8HDx4kKiqK0NBQli9fTvv27dmzZw81atRg27ZtDBgwgPHjxxMZGcnq1asZM2ZMjus8e/Ysb775Jp988gnFihXjkUceYcSIESxYsACA999/nzFjxjB9+nQaNGjA7t27GThwIKVKlaJv376AtdalSpUqzJ07N8PXsNlszJkzhzp16vD+++/z4Ycf0r17dzp37uzoM378eMaPH59prV988QWtrjFemX71xeLFM/5RSE1NZdeuXTz77LMu7e3atWPzpQ1/4uPjOXr0KO3atXMc9/HxoXXr1mzevJlBgwY52mfNmsVtt91G7969+fTTT1m3bp3js8yuIUOG8MADD3DPPffw6quvXrd/SkrKVVee9fX1Zfv27Vy4cAFvb+9r9tm0aVOOahUR4OefoVs3+O47Z1uvXvjPmsUqP/8icdHTHI18jB8/3gAuv2mlpaWZMWPGmJCQEFOyZEnTunVr8/3339/wc2Zr5KNiRZf06LZbxYo3/L769u1rvLy8TKlSpRy3rl27GmPMVb+t3ui0yy+//GJsNps5cuSIS/vdd99tRo8ebYwxpmfPnqZ9+/Yux7t3757jkQ/A/PLLL47HvPvuuyYoKMhxPzw83CxcuNDleV955RXTvHlzx/0+ffo4Rg8y89FHH5lixYqZ8PBwc/LkSZdjx48fN/v378/0dvbs2Qyf96+//jKVKlUyzz///DVf+8iRIwYw33zzjUv7a6+9ZiIiIowxxnzzzTcGuOpzGDhwoGnXrt1Vzzlr1iwDmCeeeOK67/16Ix+LFi0yt912m+Nn4kZGPkaPHm2Cg4PNzp07TVpamtmxY4epUKGCARyjVz179jS1a9c2P//8s7Hb7WbNmjXG19fXlChRIsPn1MiHyA1asMCY0qWd3yMlSxrz/vvGpKV5urIcc8vIx44dO5g9ezZ169Z1aZ80aRJTpkxh7ty5RERE8Oqrr3Lvvfeyb98+/P39s/tymQsOzpvnzeXXbdu2LTNnznTcL1WqVI5e/ttvv8UYQ0REhEt7SkoKN1/acvfHH3+8anFm8+bNc7x40M/Pj2rVqjnuh4SEcOzYMQD+/PNPEhISeOyxxxyjNwAXL150WbR65SLHa+nfvz8vvvgiTz/99FWLXsuWLUvZsmWzXH9ycjIPPPAAtWvXvqGRIJvN5nLfGHNV2430sdvtzJs3Dz8/P7Zu3crFixddRl1iY2Pp0KGD435qairGGJYuXepoe+6553juuedISEhg6NChrFmz5qpRisy8+OKLHD16lGbNmmGMISgoiH79+jFp0iS8Lv2KNW3aNAYOHEitWrWw2WxUq1aN/v37M2fOnBt+HRG5zNmz1k5iH3zgbKtVC5YsgTp1PFeXh2QrfJw+fZrevXvz/vvvuwzzGmOYOnUqzz//PJGRkQDMmzePoKAgFi5c6DL8nKtyeeojr5QqVYrq1avn2vOlpaXh5eXFrl27HF8a6dKH8k0eXdXW29vb5b7NZnO8VlpaGmBNvTRt2tSl35V13qjixYtnODWSnWmXU6dO0b59e0qXLs3y5cuvei+XK1euHF5eXhy9Ylrv2LFjBAUFARB8KYQePXqUkMvOhbu8T7o333yT/fv3s2PHDu666y7Gjx/PSy+95DjeuHFjxynOAG+//TZHjhzh9ddfd7Slh61du3Zx7NgxGjVq5Dhmt9vZuHEj06dPJyUlJcO/b19fXz766CPee+89/vjjD0JCQpg9ezb+/v6UK1cOgPLly7NixQrOnz/P8ePHCQ0N5dlnn6Vq1arX/LsSkWv48UdrmuX7751tffvCu+9CDn8JLaiyFT6uNceclbnvdCkpKaSkpDjuJycnZ6ekQqVEiRLY7fbrtjVo0AC73c6xY8euuaahdu3abN261aXtyvu5LSgoiIoVK/Lrr7/Su3fvPH2txx9/nG7dumXap2LFio7/Tk5O5r777sPHx4eVK1ded8SgRIkSNGrUiLVr17qMIK1du5ZOnToBULVqVYKDg1m7di0NGjQArBGLDRs2uISGvXv3MmbMGObPn0/t2rWZNWsW3bp1o3Pnzo4RRF9fX5eAWrZsWZKTkzMMrXfffTd79uxxaevfvz+1atVi1KhR1w163t7ehIWFARAVFcXf//53il1xrYiSJUtSsWJFLly4wLJly677dy0iV5g3DwYPtkY+APz8YMYMK3wUYVkOH1FRUXz77bfs2LHjqmPpvx1e+dteUFAQv/32W4bPN2HCBF5++eWsllGoValShY0bN9KjRw98fHwoV64cVapU4fTp03z99dfUq1cPPz8/IiIi6N27N48++iiTJ0+mQYMG/PXXX6xbt446depw//338/TTT9OiRQsmTZpE586dWbNmjVv2axg7dixPP/00AQEBdOjQgZSUFHbu3MmJEycYPnw4AI8++igVK1ZkwoQJ2X6drEy7nDp1inbt2nH27Fnmz59PcnKyI+yWL1/e8WV9991306VLF5588kkAhg8fTp8+fWjcuDHNmzdn9uzZHDp0iMcffxzAsbfG+PHjqVGjBjVq1GD8+PH4+fnRq1cvwJpy6tu3L126dKFr164AdO7cmYcffph+/fqxffv2ay56vRZ/f39uu+02l7ZSpUpx8803u7SPHj2aI0eOOKa5fv75Z7Zv307Tpk05ceIEU6ZM4fvvv2fevHmOx2zbto0jR45Qv359jhw5wtixY0lLS2PkyJFZ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2foZLqifa1YUmvBRokQJGjVq5Dg7IN3atWtp0aJFho9p3rz5Vf3XrFlD48aN8fb2zrNac8oYw5NPPkl0dDTr1q2jatWq2Xqe3bt3ExISksvV5b2UlBR+/PHHa9ZeUD/Xy82ZM4cKFSrwwAMPZPmxBfFzrVq1KsHBwS6fW2pqKhs2bLjmzy9c+7PO7DH5RXrw2L9/P1999VW2grExhri4uAL3eR8/fpyEhIRM6y7Iny1YI5eNGjWiXr16WX5sQf1cs8RTK13zQlRUlPH29jYffvih+eGHH8ywYcNMqVKlzMGDB40xxjz77LOmT58+jv6//vqr8fPzM//617/MDz/8YD788EPj7e1tli5d6qm3cEOeeOIJExgYaGJiYkxiYqLjdvbsWUefK9/rW2+9ZZYvX25+/vln8/3335tnn33WAGbZsmWeeAtZ8swzz5iYmBjz66+/mq1bt5q///3vxt/fv9B9runsdrupVKmSGTVq1FXHCvLneurUKbN7926ze/duA5gpU6aY3bt3O87umDhxogkMDDTR0dFmz549pmfPniYkJMQkJyc7nqNPnz4uZ6998803xsvLy0ycONH8+OOPZuLEiaZ48eJm69atbn9/V8rs/V64cME8+OCDJiwszMTFxbn8HKekpDie48r3O3bsWLN69Wpz4MABs3v3btO/f39TvHhxs23bNk+8RYfM3uupU6fMM888YzZv3mzi4+PN+vXrTfPmzU3FihUL5Gd7vX/HxhiTlJRk/Pz8zMyZMzN8joLyuealQhU+jDHm3XffNZUrVzYlSpQwDRs2dDn9tG/fvqZ169Yu/WNiYkyDBg1MiRIlTJUqVa75jyU/ATK8zZkzx9Hnyvf6+uuvm2rVqpmSJUuam266ydxxxx3m888/d3/x2dC9e3cTEhJivL29TWhoqImMjDR79+51HC8sn2u6L7/80gBm3759Vx0ryJ9r+mnBV9769u1rjLFOtx0zZowJDg42Pj4+5s477zR79uxxeY7WrVs7+qf79NNPTc2aNY23t7epVatWvglemb3f+Pj4a/4cr1+/3vEcV77fYcOGmUqVKpkSJUqY8uXLm3bt2pnNmze7/81dIbP3evbsWdOuXTtTvnx54+3tbSpVqmT69u1rDh065PIcBeWzvd6/Y2OMee+994yvr685efJkhs9RUD7XvGQz5tJKPBERERE3KDRrPkRERKRgUPgQERERt1L4EBEREbdS+BARERG3UvgQERERt1L4EBEREbdS+BARERG3UvgQERERt1L4EBEREbdS+BARERG3UvgQERERt/p/nqbjDgOy3lwAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "自定义直线方程: Y = 2X + 5\n",
      "模型得到的直线方程: Y = [[2.00137559]]X + [4.98927347]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "A = 2 \n",
    "B = 5\n",
    "X = np.arange(0, 20).reshape(-1, 1)  # X的值从0到19\n",
    "Y = A * X + B\n",
    "\n",
    "# 噪声\n",
    "noise = np.random.normal(0, 0.1, Y.shape)  \n",
    "Y_noisy = Y + noise\n",
    "\n",
    "# 构建模型\n",
    "regr = LinearRegression()\n",
    "regr.fit(X, Y_noisy)\n",
    "\n",
    "# 获取模型的a，b\n",
    "coef, intercept = regr.coef_, regr.intercept_\n",
    "\n",
    "# 预测y\n",
    "x = np.arange(0, 20).reshape(-1, 1)\n",
    "y = regr.predict(x)\n",
    "\n",
    "# 绘直线\n",
    "plt.scatter(X, Y_noisy, color='blue', label='Noisy data')\n",
    "plt.plot(x, y, color='red', linewidth=2, label='Fitted line: Y=%.2fX+%.2f' % (coef, intercept))\n",
    "plt.legend()\n",
    "plt.title('线性模型拟合结果')\n",
    "plt.show()\n",
    "\n",
    "# 比较模型结果和预期结果\n",
    "print(f\"自定义直线方程: Y = {A}X + {B}\")\n",
    "print(f\"模型得到的直线方程: Y = {coef}X + {intercept}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e28a6ab0-9005-4219-818a-a1eed7d9f12b",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
